package com.employment.service;

import com.employment.entity.JobApplication;
import com.mybatisflex.core.paginate.Page;

import java.util.List;

/**
 * 求职申请服务接口
 * 
 * @author Employment System
 * @since 1.0.0
 */
public interface JobApplicationService {

    /**
     * 投递简历申请职位
     *
     * @param jobApplication 申请信息
     * @return 申请结果
     */
    boolean applyJob(JobApplication jobApplication);

    /**
     * 撤回申请
     *
     * @param applicationId 申请ID
     * @param userId        用户ID
     * @return 撤回结果
     */
    boolean withdrawApplication(Long applicationId, Long userId);

    /**
     * 查看申请详情
     *
     * @param applicationId 申请ID
     * @return 申请详情
     */
    JobApplication getApplicationById(Long applicationId);

    /**
     * 分页查询用户申请列表
     *
     * @param page   分页参数
     * @param userId 用户ID
     * @param status 申请状态
     * @return 申请分页列表
     */
    Page<JobApplication> getUserApplicationPage(Page<JobApplication> page,
                                                Long userId,
                                                Integer status);

    /**
     * 分页查询公司收到的申请列表
     *
     * @param page      分页参数
     * @param companyId 公司ID
     * @param jobId     职位ID
     * @param status    申请状态
     * @return 申请分页列表
     */
    Page<JobApplication> getCompanyApplicationPage(Page<JobApplication> page,
                                                  Long companyId,
                                                  Long jobId,
                                                  Integer status);

    /**
     * 检查用户是否已申请该职位
     *
     * @param userId 用户ID
     * @param jobId  职位ID
     * @return 是否已申请
     */
    boolean hasApplied(Long userId, Long jobId);

    /**
     * 企业查看申请
     *
     * @param applicationId 申请ID
     * @param viewedBy      查看人ID
     * @return 查看结果
     */
    boolean viewApplication(Long applicationId, Long viewedBy);

    /**
     * 企业回复申请
     *
     * @param applicationId 申请ID
     * @param replyContent  回复内容
     * @param status        新状态
     * @param operatorId    操作人ID
     * @return 回复结果
     */
    boolean replyApplication(Long applicationId, String replyContent, Integer status, Long operatorId);

    /**
     * 发送面试邀请
     *
     * @param jobApplication 申请信息（包含面试时间、地点等）
     * @param operatorId     操作人ID
     * @return 邀请结果
     */
    boolean sendInterviewInvitation(JobApplication jobApplication, Long operatorId);

    /**
     * 拒绝申请
     *
     * @param applicationId 申请ID
     * @param rejectReason  拒绝原因
     * @param operatorId    操作人ID
     * @return 拒绝结果
     */
    boolean rejectApplication(Long applicationId, String rejectReason, Long operatorId);

    /**
     * 录用申请者
     *
     * @param applicationId 申请ID
     * @param operatorId    操作人ID
     * @return 录用结果
     */
    boolean hireApplicant(Long applicationId, Long operatorId);

    /**
     * 统计用户申请数据
     *
     * @param userId 用户ID
     * @return 统计数据
     */
    List<String> getUserApplicationStats(Long userId);

    /**
     * 统计公司申请数据
     *
     * @param companyId 公司ID
     * @return 统计数据
     */
    List<String> getCompanyApplicationStats(Long companyId);

    /**
     * 查询待处理申请数量
     *
     * @param companyId 公司ID
     * @return 待处理数量
     */
    Integer getPendingApplicationCount(Long companyId);

    /**
     * 批量更新申请状态
     *
     * @param applicationIds 申请ID列表
     * @param status         新状态
     * @param operatorId     操作人ID
     * @return 更新结果
     */
    boolean batchUpdateStatus(List<Long> applicationIds, Integer status, Long operatorId);

    /**
     * 批量删除申请
     *
     * @param applicationIds 申请ID列表
     * @param operatorId     操作人ID
     * @return 删除结果
     */
    boolean batchDeleteApplications(List<Long> applicationIds, Long operatorId);
}